package com.apps.java.javanote02;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class _25网络编程_UDP通信程序 {
    /**
     * UDP通信原理
     * 	一、 概述
     * 		UDP协议是一种不可靠的网络协议，它在通信的两端各建立一个Socket对象，但是这两个Socket知识发送，接收数据的对象。
     * 		对于基于UDP协议的通信双方而言，没有所谓的客户端和服务器的概念。
     *
     * 		java提供了DatagramSocket类作为基于UDP协议的Socket
     *
     * 	二、UDP发送数据
     * 		发送数据的步骤
     * 		1.创建发送端的Socket对象(DatagramSocket)
     * 			DatagramSocket()
     * 		2.创建数据，并把数据打包
     * 			DatagramPacket(byte[] buf , int length , InetAddress address, int port)
     * 		3.调用DatagramSoket对象的方法发送数据
     * 			void send(DatagramPacket p)
     * 		4.关闭发送端
     * 			void close()
     *
     * 	三、UDP接收数据
     * 		接收数据的步骤
     * 		1.创建接收端的Socket对象(DatagramSocket)
     * 			DatagramSocket(int port)
     * 		2.创建一个数据包，用于接收数据
     * 			DatagramPacket(byte[] buf , int length)
     * 		3.调用DatagramSocket对象的方法接收数据
     * 			void receive(DatagramPacket)
     * 		4.解析数据包，并把数据在控制台显示
     * 			byte[] getData()
     * 			int getLength()
     * 		5.关闭接收端
     * 			void close()
     *
     *
     */

    public static void main(String[] args) throws Exception {
        //创建发送端的Soket对象
        //DatagramSocket()构造数据报套接字符并将其绑定到本地主机上的任何可用端口
        DatagramSocket ds = new DatagramSocket();

        //创建数据，并把数据打包
        //DatagramPacket (byte[] buf, int length, InetAddress address, int port)
        //构造一个数据包，发送长度为length的数据包到指定主机上的指定端口号。
        //buf数据，length数据长度，address主机，port端口号
        byte[] buf = "hello!UDP!初次见面".getBytes();
        DatagramPacket dp = new DatagramPacket(buf, buf.length , InetAddress.getByName("192.168.0.108"), 31121);

        //调用DatagramSocket对象的方法发送数据
        //void send (DatagramPacket p) 从此套接字发送数据报包
        ds.send(dp);

        //关闭资源
        ds.close();

        //创建接收端Socket对象
        DatagramSocket djs = new DatagramSocket(31121);

        //创建一个数据包
        byte[] bys = new byte[1024];
        DatagramPacket dps = new DatagramPacket(bys, bys.length);

        //调用DatagramSocket对象的方法接收数据
        djs.receive(dps);

        //解析数据包，并把数据在控制台显示
        //byte[] getData()：返回数据缓冲区
//		byte[] data = dps.getData();

        //int getLength()：返回要发送的数据的长度或接收到的数据的长度
//		int lens = dps.getLength();

        System.out.println("数据是：" + new String(dps.getData(),0,dps.getLength()));

        //关闭接收端
        djs.close();

    }

}
